package services

import (
	"fmt"
	"strings"
	"time"

	"github.com/signintech/gopdf"
)

type Patient struct {
	ID            string   `json:"id"`
	Name          string   `json:"name"`
	Gender        string   `json:"gender"`
	Age           int      `json:"age"`
	Contact       string   `json:"contact"`
	MedicalRecord []Record `json:"medicalRecord"`
}

type Record struct {
	VisitDate CustomTime `json:"visitDate"`
	Symptoms  string     `json:"symptoms"`
	Diagnosis string     `json:"diagnosis"`
	Treatment string     `json:"treatment"`
}

type CustomTime struct {
	time.Time
}

const ctLayout = "2006-01-02"

func (ct *CustomTime) UnmarshalJSON(b []byte) error {
	s := strings.Trim(string(b), `"`) // 去掉 JSON 字符串的引号
	t, err := time.Parse(ctLayout, s)
	if err != nil {
		return err
	}
	ct.Time = t
	return nil
}

func wrapText(pdf *gopdf.GoPdf, text string, maxWidth float64) []string {
	var lines []string
	words := strings.Fields(text)
	var line string

	for _, word := range words {
		width, err := pdf.MeasureTextWidth(line + " " + word)
		if err != nil {
			return nil
		}
		if width < maxWidth {
			if line == "" {
				line = word
			} else {
				line += " " + word
			}
		} else {
			lines = append(lines, line)
			line = word
		}
	}
	if line != "" {
		lines = append(lines, line)
	}
	return lines
}

func GeneratePDF(patient Patient) error {
	pdf := gopdf.GoPdf{}
	pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4})
	pdf.AddPage()

	// 设置字体
	err := pdf.AddTTFFont("simhei", "./simhei.ttf") // 需要一个支持中文的字体文件
	if err != nil {
		return fmt.Errorf("failed to add font: %v", err)
	}
	pdf.SetFont("simhei", "", 12)

	maxWidth := 500.0 // 设置最大宽度

	// 添加患者基本信息
	pdf.SetFont("simhei", "", 14) // 设置字体大小为14
	pdf.SetTextColor(0, 0, 0)     // 设置字体颜色为黑色

	// 患者姓名
	pdf.Cell(nil, "患者姓名: ")
	pdf.SetTextColor(255, 0, 0) // 设置字体颜色为红色
	pdf.Cell(nil, patient.Name)
	pdf.Br(20)

	// 性别
	pdf.SetTextColor(0, 0, 0) // 恢复字体颜色为黑色
	pdf.Cell(nil, "性别: ")
	pdf.SetTextColor(255, 0, 0) // 设置字体颜色为红色
	pdf.Cell(nil, patient.Gender)
	pdf.Br(20)

	// 年龄
	pdf.SetTextColor(0, 0, 0) // 恢复字体颜色为黑色
	pdf.Cell(nil, "年龄: ")
	pdf.SetTextColor(255, 0, 0) // 设置字体颜色为红色
	pdf.Cell(nil, fmt.Sprintf("%d", patient.Age))
	pdf.Br(20)

	// 联系方式
	pdf.SetTextColor(0, 0, 0) // 恢复字体颜色为黑色
	pdf.Cell(nil, "联系方式: ")
	pdf.SetTextColor(255, 0, 0) // 设置字体颜色为红色
	pdf.Cell(nil, patient.Contact)
	pdf.Br(20)

	// 添加病历记录
	for _, record := range patient.MedicalRecord {
		pdf.SetFont("simhei", "", 14) // 设置字体大小为14
		pdf.SetTextColor(0, 0, 0)     // 恢复字体颜色为黑色

		// 就诊日期
		pdf.Cell(nil, "就诊日期: ")
		pdf.SetTextColor(255, 0, 0) // 设置字体颜色为红色
		pdf.Cell(nil, record.VisitDate.Format(ctLayout))
		pdf.Br(20)

		// 症状
		pdf.SetTextColor(0, 0, 0) // 恢复字体颜色为黑色
		pdf.Cell(nil, "症状: ")
		pdf.SetTextColor(255, 0, 0) // 设置字体颜色为红色
		symptomsLines := wrapText(&pdf, record.Symptoms, maxWidth)
		for _, line := range symptomsLines {
			pdf.Cell(nil, line)
			pdf.Br(20)
		}

		// 诊断
		pdf.SetTextColor(0, 0, 0) // 恢复字体颜色为黑色
		pdf.Cell(nil, "诊断: ")
		pdf.SetTextColor(255, 0, 0) // 设置字体颜色为红色
		diagnosisLines := wrapText(&pdf, record.Diagnosis, maxWidth)
		for _, line := range diagnosisLines {
			pdf.Cell(nil, line)
			pdf.Br(20)
		}

		// 治疗方案
		pdf.SetTextColor(0, 0, 0) // 恢复字体颜色为黑色
		pdf.Cell(nil, "治疗方案: ")
		pdf.SetTextColor(255, 0, 0) // 设置字体颜色为红色
		treatmentLines := wrapText(&pdf, record.Treatment, maxWidth)
		for _, line := range treatmentLines {
			pdf.Cell(nil, line)
			pdf.Br(20)
		}
	}

	// 保存 PDF 文件
	err = pdf.WritePdf("patient_record.pdf")
	if err != nil {
		return fmt.Errorf("failed to write PDF: %v", err)
	}
	return nil
}
